#include "CarStop.h"

//两个栈实现一个队列
//两个栈不能同时有数据

class MyQueue
{
public:
    using ElementType = LinkStack::ElementType;
    void Push(const ElementType& element)
    {
        while(s2.IsEmpty() == false)
        {
            s1.Push(*s2.GetTop());
            s2.Pop();
        }
        s1.Push(element);
    }
    void Pop()
    {
        while(s1.IsEmpty() == false)
        {
            s2.Push(*s1.GetTop());
            s1.Pop();
        }
        s2.Pop();
    }
    ElementType* GetFront()
    {
        while(s1.IsEmpty() == false)
        {
            s2.Push(*s1.GetTop());
            s1.Pop();
        }
        return s2.GetTop();
    }
    bool IsEmpty()
    {
        return s1.IsEmpty() && s2.IsEmpty();
    }
private:
    LinkStack s1;
    LinkStack s2;
};




class MyStack
{
public:
    using ElementType = LinkQueue::ElementType;
    void Push(const ElementType& element)
    {
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
        q1.Push(element);
    }
    void Pop()
    {
        while(q1.Size() > 1)
        {
            q2.Push(*q1.GetFront());
            q1.Pop();
        }
        q1.Pop();
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
    }
    ElementType* GetTop()
    {
        while(q1.Size() > 1)
        {
            q2.Push(*q1.GetFront());
            q1.Pop();
        }
        ElementType* s = (ElementType*)*q1.GetFront();
        q2.Push(*q1.GetFront());
        q1.Pop();
        while(q2.IsEmpty() == false)
        {
            q1.Push(*q2.GetFront());
            q2.Pop();
        }
        return s;
    }
    bool IsEmpty()
    {
        return q1.IsEmpty() && q2.IsEmpty();
    }
private:
    LinkQueue q1;
    LinkQueue q2;
};









// class MyQueue
// {
// public:
//     using ElementType = LinkStack::ElementType;
//     void Push(const ElementType& element)
//     {
//         while(s2.IsEmpty() == false)
//         {
//             s1.Push(*s2.GetTop());
//             s2.Pop();
//         }
//         s1.Push(element);
//     }
//     void Pop()
//     {
//         while(s1.IsEmpty() == false)
//         {
//             s2.Push(*s1.GetTop());
//             s1.Pop();
//         }
//         s2.Pop();
//     }
//     ElementType* GetFront()
//     {
//         while(s1.IsEmpty() == false)
//         {
//             s2.Push(*s1.GetTop());
//             s1.Pop();
//         }
//         return s2.GetTop();
//     }

//     bool Isempty()
//     {
//         return s1.IsEmpty() == s2.IsEmpty();
//     }
// private:
//     LinkStack s1;
//     LinkStack s2;
// };

// //两个队列实现一个栈
// class Mystack
// {
// public:
//     using ElementType = LinkStack::ElementType;
//     void Push(const ElementType& element)
//     {
//         while(q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//         q1.Push(element);
//     }
//     void Pop()
//     {
//         while(q1.Size() > 1)
//         {
//             q2.Push(*q1.GetFront());
//             q1.Pop();
//         }
//         q1.Pop();
//         while(q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//     }
//     ElementType* GetTop()
//     {
//         while(q1.Size() > 1)
//         {
//             q2.Push(*q1.GetFront());
//             q1.Pop();
//         }
//         ElementType* r =(ElementType*) *q1.GetFront();
//         q2.Push(*q1.GetFront());
//         q1.Pop(); 
//         while(q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//         return r;
//     }

//     bool Ismpty()
//     {
//         return q1.IsEmpty() && q2.IsEmpty();
//     }
// private:
//     LinkQueue q1;
//     LinkQueue q2;

// };

int main()
{
    // CarStop s(3);
    // while(1)
    // {
    //     s.show();
    //     std::cout<<"1、车辆进入停车场\n";
    //     std::cout<<"2、车辆离开停车场\n";
    //     std::cout<<"3、退出\n";

    //     int choice = 0;
    //     std::cin>>choice;
    //     switch(choice)
    //     {
    //         case 1:s.ComeCar();break;
    //         case 2:s.LeaveCar();break;
    //         default:
    //             return 0;
    //     }
    // }
    // std::cout<<std::endl;


    MyStack q;
    for(long i = 1;i <= 10;i++)
    {
        q.Push((void*)i);
    }
    while(q.IsEmpty() == false)
    {
        std::cout<<(long)q.GetTop()<<" ";
        q.Pop();
    }
    std::cout<<std::endl;
    return 0;
}